package com.ssy.lingxi.order.model.constant;

import com.ssy.lingxi.common.language.LanguageHolder;

import java.util.Arrays;

/**
 * 基础交易流程枚举定义
 * @author 万宁
 * @version 2.0.0
 * @date 2022-02-24
 */
public enum BaseTradeProcessEnum {
    /**
     * 订单多次发货流程 - 1
     */
    order_direct_delivery(1, "order_direct_delivery", "订单多次发货流程", "1-订单提交-->2-订单发货-->3-订单收货"),

    /**
     * 一次支付多次发货流程 - 2
     */
    order_pay_one_deliveries(2, "order_pay_one_deliveries", "一次支付多次发货流程", "1-提交订单-->2-订单支付-->3-确认支付结果-->4-订单发货确认-->5-订单收货确认"),

    /**
     * 积分订单流程 - 3
     */
    order_right_point(3, "order_right_point", "积分订单流程", "1-提交订单-->2-订单支付-->3-确认支付结果-->4-订单发货确认-->5-订单收货确认"),

    /**
     * 多次支付多次发货流程 - 4
     */
    order_pay_deliveries(4, "order_pay_deliveries", "多次支付多次发货流程", "1-提交订单-->2-订单支付-->3-确认支付结果-->4-订单发货确认-->5-订单收货确认-->6-订单支付-->7-确认支付结果"),

    /**
     * 订单审核多次支付多次发货流程 - 5
     */
    order_validate_pay_seven_deliveries(5, "order_validate_pay_seven_deliveries", "订单审核多次支付多次发货流程", "1-提交订单-->2-确认订单-->3-订单支付-->4-确认支付结果-->5-订单发货确认-->6-订单收货确认-->7-订单支付-->8-确认支付结果"),

    /**
     * 售后换货处理流程1 - 6
     */
    after_sale_replace_goods_outer_verify_ext(6, "after_sale_replace_goods_outer_verify_ext", "售后换货处理流程1(含收发货单)", "1-提交换货申请单-->2-确认换货申请单-->3-新增退货发货单-->4-新增物流单-->5-退货发货-->6-新增退货入库单-->7-退货收货-->8-确认退货回单-->9-新增换货发货单-->10-新增物流单-->11-换货发货-->12-新增换货入库单-->13-换货收货-->14-确认换货回单-->15-确认售后完成"),

    /**
     * 售后换货处理流程2(无收发货单) - 7
     */
    after_sale_replace_goods_manual_delivery_ext(7, "after_sale_replace_goods_manual_delivery_ext", "售后换货处理流程2(无收发货单)", "1-提交换货申请单-->2-确认换货申请单-->3-退货发货-->4-退货收货-->5-换货发货-->6-换货收货-->7-确认售后完成"),

    /**
     * 售后换货处理流程3(线下物流) - 8
     */
    after_sale_replace_goods_outer_verify_offline_logistics_ext(8, "after_sale_replace_goods_outer_verify_offline_logistics_ext", "售后换货处理流程3(线下物流)", "1-采购商提交换货申请单-->2-供应商确认换货申请单-->3-采购商新增退货发货单-->4-采购商退货发货-->5-供应商新增退货收货单-->6-供应商退货收货-->7-供应商新增换货发货单-->8-供应商换货发货-->9-采购商新增换货收货单-->10-采购商换货收货-->11-采购商确认售后完成"),

    /**
     * 售后退货处理流程1(含收发货单) - 9
     */
    after_sale_return_goods_outer_verify_ext(9, "after_sale_return_goods_outer_verify_ext", "售后退货处理流程1(含收发货单)", "1：采购商提交退货申请单-->2：供应商确认退货申请单-->3：采购商新增退货发货单-->4：采购商新增物流单-->5：采购商退货发货-->6：供应商新增退货入库单-->7：供应商退货收货-->8：采购商确认退货回单-->9：供应商退款-->10：采购商确认售后完成"),

    /**
     * 售后退货处理流程2(线下物流) - 10
     */
    after_sale_return_goods_outer_verify_offline_logistics_ext(10, "after_sale_return_goods_outer_verify_offline_logistics_ext", "售后退货处理流程2(线下物流)", "1：采购商提交退货申请单-->2：供应商确认退货申请单-->3：采购商新增退货发货单-->4：采购商退货发货-->5：供应商新增退货入库单-->6：供应商退货收货-->7：供应商退款-->8：采购商确认售后完成"),

    /**
     * 售后退货处理流程3(无收发货单) - 11
     */
    after_sale_return_goods_manual_delivery_ext(11, "after_sale_return_goods_manual_delivery_ext", "售后退货处理流程3(无收发货单)", "1：采购商提交退货申请单-->2：供应商确认退货申请单-->3：采购商退货发货-->4：供应商退货收货-->5：供应商退款-->6：采购商确认售后完成"),

    /**
     * 售后退货处理流程4(平台审核无收发货单) - 12
     */
    after_sale_return_goods_pf_manual_delivery_ext(12, "after_sale_return_goods_pf_manual_delivery_ext", "售后退货处理流程4(平台审核无收发货单)", "1：采购商提交退货申请单-->2：供应商确认退货申请单-->3：平台确认退货申请单-->4：采购商退货发货-->5：供应商退货收货-->6：供应商退款-->7：采购商确认售后完成"),

    /**
     * 加工生产处理流程 - 13
     */
    pno_outer_verify_ext(13, "pno_outer_verify_ext", "加工生产处理流程", "1-提交生产通知单-->2-确认生产通知单-->3-新增加工发货单-->4-新增物流单-->5-生产通知单发货-->6-新增加工入库单-->7-生产通知单收货-->8-确认回单-->9-完成"),

    /**
     * 加工生产手工发货处理流程 - 14
     */
    pno_manual_delivery_outer_verify_ext(14, "pno_manual_delivery_outer_verify_ext", "加工生产手工发货处理流程", "1-提交生产通知单-->2-确认生产通知单-->5-生产通知单发货-->7-生产通知单收货-->9-完成"),

    /**
     * 售后维修流程 - 15
     */
    after_sale_repair_inner_verify(15, "after_sale_repair_inner_verify", "售后维修流程", "1-提交审核维修申请单-->2-审核维修申请单(一级)-->3-审核维修申请单(二级)-->4-确认维修申请单-->5-完成"),

    /**
     * 多次支付多次发货有收发货单线上物流流程 - 16
     */
    order_pay_online_deliveries(16, "order_pay_online_deliveries", "多次支付多次发货有收发货单线上物流流程", "1-提交订单-->2-订单支付-->3-确认支付结果-->4-新增销售发货单-->5-新增物流单-->6-订单发货确认-->7-新增采购收货单-->8-订单收货确认"),

    /**
     * 跨境电商进口订单交易流程 - 17
     */
    order_commerce_import(17, "order_commerce_import", "跨境电商进口订单交易流程", "1-订单提交-->2-订单支付-->3-订单发货-->4-订单收货-->5-订单评价-->5-订单完成");

    BaseTradeProcessEnum(Integer code, String processKey, String name, String remark) {
        this.code = code;
        this.processKey = processKey;
    }

    private Integer code;
    private String processKey;

    public Integer getCode() {
        return code;
    }

    public String getProcessKey() {
        return processKey;
    }

    public String getName() {
        return LanguageHolder.getName(this.getClass(), this.code);
    }

    public String getRemark() {
        return LanguageHolder.getName(this.getClass().getSimpleName().concat(".r.").concat(String.valueOf(this.code)));
    }

    /**
     * 根据流程枚举值查询流程名称
     * @param code 流程枚举值
     * @return 流程名称
     */
    public static String getNameByCode(Integer code) {
        return Arrays.stream(BaseTradeProcessEnum.values()).filter(p -> p.getCode().equals(code)).map(BaseTradeProcessEnum::getName).findFirst().orElse("");
    }

    /**
     * 根据流程枚举值查询流程步骤描述
     * @param code 流程枚举值
     * @return 流程步骤描述
     */
    public static String getRemarkByCode(Integer code) {
        return Arrays.stream(BaseTradeProcessEnum.values()).filter(p -> p.getCode().equals(code)).map(BaseTradeProcessEnum::getRemark).findFirst().orElse("");
    }
}
